package com.gjy.spring.s11;

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;

/**
 * @author 宫静雨
 * @version 1.0
 * @since 2023-12-20 15:27:24
 */
public class CglibProxyDemo {

    static class Target {
        protected void foo() {
            System.out.println("foo");
        }
    }

    // 代理类是子类型，目标类是父类型
    public static void main(String[] args) {
        Target target = new Target();
        // o:代理对象, method:执行方法, objects:方法参数, methodProxy:可以避免反射调用
        Target r = (Target) Enhancer.create(Target.class, (MethodInterceptor) (o, method, objects, methodProxy) -> {
            System.out.println("before");
            //Object invoke = method.invoke(target, objects);
            //Object invoke = methodProxy.invoke(target, objects); // 内部没有用反射, 需要目标, Spring用的是这种
            Object invoke = methodProxy.invokeSuper(o, objects); // 内部没有用反射, 需要代理
            System.out.println("after");
            return invoke;
        });
        r.foo();
    }
}
